#ifndef _BOOT_H_
#define _BOOT_H_

#ifdef __cplusplus
 extern "C" {
#endif

#include "stm32f10x.h"
#include "wingbot_queue.h"
     
#ifndef WB_NULL
#define WB_NULL 0
#endif

#define FLASH_PAGE_SIZE         ((uint16_t)0x400)            //Flash每页大小
#define BT_APP_INFO_ADDR        ((uint32_t)0x08001000)       //APP固件版本信息保存地址
#define BT_APP_START_ADDR       ((uint32_t)0x08001400)       //APP的起始地址
#define BT_DOWNLOAD_INFO_ADDR   ((uint32_t)0x08008800)       //下载保存的固件信息
#define BT_DOWNLOAD_START_ADDR  ((uint32_t)0x08008C00)       //下载保存的固件起始地址
#define BT_MAX_VERSION          999999                       //最大版本号99.99.99(0x000F423F)

/* 通信协议 */
#define BT_FRAME_HEAD           0x68
#define BT_FRAME_FILE_INFO      0x00
#define BT_FRAME_FILE_DATA      0x01
     
/* 错误码 */
#define BT_ERROR_HEAD   1       //帧头错误
#define BT_ERROR_SIZE   2       //文件大小不是4的倍数
#define BT_ERROR_CRC    3       //crc校验不通过

/* boot文件控制块 */
typedef struct{
    u8 header[2];
    u16 len;
    u32 pos;            //当前的偏移地址（一定是FLASH_PAGE_SIZE的整数倍）
    Queue_T* pq;
    u8 *pdata; 
    u32 crc;
    u32 totalSize;      //文件总大小
    u16 pageNumber;     //总页数
    u32 version;        //版本信息
}BootFile_T;

/* 版本控制块 */
typedef struct{
    u32 version;
    u32 totalSize;
}BootFileInfo_T;

typedef void (*iapfun)(void);

u8 boot_file_validate(Queue_T* que, BootFile_T* boot_file);
FLASH_Status boot_download_flash(BootFile_T boot_file);
void iap_load_app(u32 appxaddr);
FLASH_Status boot_write_info(uint32_t flash_addr, BootFile_T boot_file);
__STATIC_INLINE uint32_t get_flash_data(uint32_t addr);
uint8_t boot_check_flash_begin(uint32_t appxaddr);
FLASH_Status boot_transfer_flash(uint32_t to_dest, uint32_t from_src, uint32_t len);

#ifdef __cplusplus
}
#endif

#endif
/***End of File***/
